Registration of an Image Stack¶
part of
pyTEMlib, a pycroscopy library
Notebook by
Gerd Duscher
Materials Science & Engineering Joint Institute of Advanced Materials The University of Tennessee, Knoxville
An Introduction into tegistration of an image stack.
This works also on Google Colab.
Prerequesites¶
Install pyTEMlib¶
If you have not done so in the Introduction Notebook, please test and install pyTEMlib and other important packages with the code cell below.
[41]:
import sys
from pkg_resources import get_distribution, DistributionNotFound
def test_package(package_name):
"""Test if package exists and returns version or -1
This test does not require a loading of the packages
"""
try:
version = (get_distribution(package_name).version)
except (DistributionNotFound, ImportError) as err:
version = '-1'
return version
# Colab setup ------------------
if 'google.colab' in sys.modules:
!pip install git+https://github.com/pycroscopy/pyNSID/ -q
!pip install git+https://github.com/pycroscopy/sidpy/ -q
!pip install git+https://github.com/pycroscopy/pyTEMlib/ -q
else:
# pyTEMlib setup ------------------
if test_package('pyTEMlib') < '0.2022.1.6':
!{sys.executable} -m pip install --upgrade git+https://github.com/pycroscopy/pyTEMlib
print('installed pyTEMlib')
if test_package('sidpy') < '0.0.4':
!{sys.executable} -m pip install --upgrade sidpy -q
print('installed sidpy')
if test_package('pyNSID') < '0.0.1':
!{sys.executable} -m pip install --upgrade git+https://github.com/pycroscopy/pyNSID -q
print('Installed pyNSID')
# ------------------------------
print('done')
Collecting git+https://github.com/pycroscopy/pyTEMlibinstalled pyTEMlib
Cloning https://github.com/pycroscopy/pyTEMlib to c:\users\gduscher\appdata\local\temp\pip-req-build-dl_qj9wm
Requirement already satisfied: scipy in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (1.5.3)
Requirement already satisfied: numpy in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (1.19.4)
Requirement already satisfied: pillow in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (8.0.1)
Requirement already satisfied: simpleITK in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (2.0.2)
Requirement already satisfied: ase in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (3.20.1)
Requirement already satisfied: pyNSID in c:\users\gduscher\anaconda3\lib\site-packages (from pyTEMlib==0.2021.1.5) (0.0.1)
Requirement already satisfied: matplotlib>=2.0.0 in c:\users\gduscher\anaconda3\lib\site-packages (from ase->pyTEMlib==0.2021.1.5) (3.3.3)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\gduscher\anaconda3\lib\site-packages (from matplotlib>=2.0.0->ase->pyTEMlib==0.2021.1.5) (1.3.1)
Requirement already satisfied: cycler>=0.10 in c:\users\gduscher\anaconda3\lib\site-packages (from matplotlib>=2.0.0->ase->pyTEMlib==0.2021.1.5) (0.10.0)
Requirement already satisfied: python-dateutil>=2.1 in c:\users\gduscher\anaconda3\lib\site-packages (from matplotlib>=2.0.0->ase->pyTEMlib==0.2021.1.5) (2.8.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\users\gduscher\anaconda3\lib\site-packages (from matplotlib>=2.0.0->ase->pyTEMlib==0.2021.1.5) (2.4.7)
Requirement already satisfied: six in c:\users\gduscher\anaconda3\lib\site-packages (from cycler>=0.10->matplotlib>=2.0.0->ase->pyTEMlib==0.2021.1.5) (1.15.0)
Requirement already satisfied: ipywidgets>=5.2.2 in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (7.6.0)
Requirement already satisfied: h5py>=2.6.0 in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (3.1.0)
Requirement already satisfied: toolz in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (0.11.1)
Requirement already satisfied: ipython>=6.0 in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (7.19.0)
Requirement already satisfied: sidpy>=0.0.2 in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (0.0.4)
Requirement already satisfied: dask>=0.10 in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (2020.12.0)
Requirement already satisfied: cytoolz in c:\users\gduscher\anaconda3\lib\site-packages (from pyNSID->pyTEMlib==0.2021.1.5) (0.11.0)
Requirement already satisfied: pyyaml in c:\users\gduscher\anaconda3\lib\site-packages (from dask>=0.10->pyNSID->pyTEMlib==0.2021.1.5) (5.3.1)
Requirement already satisfied: pygments in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (2.7.3)
Requirement already satisfied: backcall in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.2.0)
Requirement already satisfied: colorama in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.4.4)
Requirement already satisfied: setuptools>=18.5 in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (51.1.1)
Requirement already satisfied: pickleshare in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.7.5)
Requirement already satisfied: decorator in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (4.4.2)
Requirement already satisfied: traitlets>=4.2 in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (5.0.5)
Requirement already satisfied: jedi>=0.10 in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.17.2)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in c:\users\gduscher\anaconda3\lib\site-packages (from ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (3.0.8)
Requirement already satisfied: ipykernel>=4.5.1 in c:\users\gduscher\anaconda3\lib\site-packages (from ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (5.4.2)
Requirement already satisfied: nbformat>=4.2.0 in c:\users\gduscher\anaconda3\lib\site-packages (from ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (5.0.8)
Requirement already satisfied: widgetsnbextension~=3.5.0 in c:\users\gduscher\anaconda3\lib\site-packages (from ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (3.5.1)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in c:\users\gduscher\anaconda3\lib\site-packages (from ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.0.0)
Requirement already satisfied: jupyter-client in c:\users\gduscher\anaconda3\lib\site-packages (from ipykernel>=4.5.1->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (6.1.7)
Requirement already satisfied: tornado>=4.2 in c:\users\gduscher\anaconda3\lib\site-packages (from ipykernel>=4.5.1->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (6.1)
Requirement already satisfied: parso<0.8.0,>=0.7.0 in c:\users\gduscher\anaconda3\lib\site-packages (from jedi>=0.10->ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.7.0)
Requirement already satisfied: ipython-genutils in c:\users\gduscher\anaconda3\lib\site-packages (from nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.2.0)
Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in c:\users\gduscher\anaconda3\lib\site-packages (from nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (3.2.0)
Requirement already satisfied: jupyter-core in c:\users\gduscher\anaconda3\lib\site-packages (from nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (4.7.0)
Requirement already satisfied: pyrsistent>=0.14.0 in c:\users\gduscher\anaconda3\lib\site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.17.3)
Requirement already satisfied: attrs>=17.4.0 in c:\users\gduscher\anaconda3\lib\site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (20.3.0)
Requirement already satisfied: wcwidth in c:\users\gduscher\anaconda3\lib\site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=6.0->pyNSID->pyTEMlib==0.2021.1.5) (0.2.5)
Requirement already satisfied: joblib>=0.11.0 in c:\users\gduscher\anaconda3\lib\site-packages (from sidpy>=0.0.2->pyNSID->pyTEMlib==0.2021.1.5) (1.0.0)
Requirement already satisfied: psutil in c:\users\gduscher\anaconda3\lib\site-packages (from sidpy>=0.0.2->pyNSID->pyTEMlib==0.2021.1.5) (5.8.0)
Requirement already satisfied: notebook>=4.4.1 in c:\users\gduscher\anaconda3\lib\site-packages (from widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (6.1.6)
Requirement already satisfied: prometheus-client in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.9.0)
Requirement already satisfied: jinja2 in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (2.11.2)
Requirement already satisfied: Send2Trash in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.5.0)
Requirement already satisfied: pyzmq>=17 in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (20.0.0)
Requirement already satisfied: nbconvert in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (6.0.7)
Requirement already satisfied: argon2-cffi in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (20.1.0)
Requirement already satisfied: terminado>=0.8.3 in c:\users\gduscher\anaconda3\lib\site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.9.1)
Requirement already satisfied: pywin32>=1.0 in c:\users\gduscher\anaconda3\lib\site-packages (from jupyter-core->nbformat>=4.2.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (228)
Requirement already satisfied: pywinpty>=0.5 in c:\users\gduscher\anaconda3\lib\site-packages (from terminado>=0.8.3->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.5.7)
Requirement already satisfied: cffi>=1.0.0 in c:\users\gduscher\anaconda3\lib\site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.14.4)
Requirement already satisfied: pycparser in c:\users\gduscher\anaconda3\lib\site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (2.20)
Requirement already satisfied: MarkupSafe>=0.23 in c:\users\gduscher\anaconda3\lib\site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.1.1)
Requirement already satisfied: mistune<2,>=0.8.1 in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.8.4)
Requirement already satisfied: jupyterlab-pygments in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.1.2)
Requirement already satisfied: pandocfilters>=1.4.1 in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.4.2)
Requirement already satisfied: testpath in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.4.4)
Requirement already satisfied: entrypoints>=0.2.2 in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.3)
Requirement already satisfied: defusedxml in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.6.0)
Requirement already satisfied: bleach in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (3.2.1)
Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in c:\users\gduscher\anaconda3\lib\site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.5.1)
Requirement already satisfied: nest-asyncio in c:\users\gduscher\anaconda3\lib\site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.4.3)
Requirement already satisfied: async-generator in c:\users\gduscher\anaconda3\lib\site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (1.10)
Requirement already satisfied: packaging in c:\users\gduscher\anaconda3\lib\site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (20.8)
Requirement already satisfied: webencodings in c:\users\gduscher\anaconda3\lib\site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=5.2.2->pyNSID->pyTEMlib==0.2021.1.5) (0.5.1)
Building wheels for collected packages: pyTEMlib
Building wheel for pyTEMlib (setup.py): started
Building wheel for pyTEMlib (setup.py): finished with status 'done'
Created wheel for pyTEMlib: filename=pyTEMlib-0.2021.1.5-py2.py3-none-any.whl size=466391 sha256=d967b9aab9ed93259b9119daa86d153bc2bd30093f37cb21edbb638cda1daa8f
Stored in directory: C:\Users\gduscher\AppData\Local\Temp\pip-ephem-wheel-cache-e5a51eox\wheels\26\8c\23\58dec6616094458bcb9a74aabde477d11aab647055b048390d
Successfully built pyTEMlib
Installing collected packages: pyTEMlib
Attempting uninstall: pyTEMlib
Found existing installation: pyTEMlib 0.2021.1.4
Uninstalling pyTEMlib-0.2021.1.4:
Successfully uninstalled pyTEMlib-0.2021.1.4
Successfully installed pyTEMlib-0.2021.1.5
Installed pyNSID
done
Loading of necessary libraries¶
Please note, that we only need to load the pyTEMlib library, which is based on sidpy Datsets.
[80]:
import sys
if 'google.colab' in sys.modules:
import numpy as np
else:
%pylab --no-import-all notebook
%gui qt
# Import libraries from pyTEMlib
import sidpy
import pyTEMlib
import pyTEMlib.file_tools as ft # File input/ output library
import pyTEMlib.image_tools as it
import pyTEMlib.viz
# For archiving reasons it is a good idea to print the version numbers out at this point
print('pyTEM version: ',pyTEMlib.__version__)
import pyNSID
__notebook__ = '2_Image_Registration'
__notebook_version__ = '2021_01_04'
Populating the interactive namespace from numpy and matplotlib
pyTEM version: 0.2021.01.05
Open File¶
Choose Mode of File Selection¶
Here you can choose between a FileWidget or a FileDialog to select a file.
The FileWidget will use display the name of a Nion File like in NionSwift and is often the better way for those files.
The FileDialog does not work on Google Colab and thus the FileWidget will be used automatically.
[81]:
# ---- INPUT choices ---- #
Open_Nion_Directory = True
bokeh_plot = True # using bokeh to plot or not
# ------------------------#
drive_directory = ft.get_last_path()
if 'google.colab' in sys.modules:
from google.colab import drive
drive.mount("/content/drive")
Open_Nion_Directory = True
drive_directory = 'drive/MyDrive/'
bokeh_plot = True
elif not ft.QT_available:
Open_Nion_Directory = True
if bokeh_plot == True:
from bokeh.plotting import figure, show, output_notebook
from bokeh.models import LinearAxis, Range1d
output_notebook()
### Open file widget
if Open_Nion_Directory:
file_widget = pyTEMlib.file_tools.FileWidget(drive_directory)
Load File¶
If you did not choose the file widget a File Dialog window will open in the next code cell.
Otherewise just select a File in the widget above
These datasets are stored in the pyNSID data format (extension: hf5) automatically.
All results can be stored in that file.
[82]:
try:
current_channel.file.close()
except:
pass
if Open_Nion_Directory:
dataset = pyTEMlib.file_tools.open_file(file_widget.file_name)
else:
dataset = pyTEMlib.file_tools.open_file()
current_channel = dataset.h5_dataset.parent.parent
found_log = False
for key in current_channel:
if 'Log' in key:
if found_log == False:
print('Stored Results:')
found_log = True
for key2 in current_channel[key]:
if '_metadata' in current_channel[key][key2]:
if 'analysis' in current_channel[key][key2]['_metadata'].attrs.keys():
print(f" - {key} includes analysis: {current_channel[key][key2]['_metadata'].attrs['analysis']}")
if bokeh_plot:
p = pyTEMlib.viz.plot(dataset)
show(p)
else:
dataset.plot()
dataset
C:\Users\gduscher\Anaconda3\lib\site-packages\pyNSID\io\nsi_reader.py:29: FutureWarning: This Reader will eventually be moved to the ScopeReaders package. Be prepared to change your import statements
warn('This Reader will eventually be moved to the ScopeReaders package'
C:\Users\gduscher\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py:87: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
Stored Results:
- Log_000 includes analysis: rigid sub-pixel registration
- Log_001 includes analysis: non-rigid demon registration